var express = require('express');
var app = express();
var http = require('http').Server(app);
var bodyParser = require('body-parser');
const crypto = require('crypto');
var qr = require('qr-image');  
var fs = require('fs');
const { spawn } = require('child_process');
var file_read = require('./fs_read_write.js');
var server_image = require('../file/server_image.js');
app.use(bodyParser.json());
app.use(express.static(__dirname + '/server_file/minyanan'));
app.all('*', function (req, res, next){
    res.header("Access-Control-Allow-Origin", "*");
    res.header("Access-Control-Allow-Headers", "X-Requested-With,Content-Type,token,Accept");
    res.header("Access-Control-Allow-Methods", "PUT,POST,GET,DELETE,OPTIONS");
    res.header("X-Powered-By", 'BIM');
    next();
});
http.listen(9088, function () {
    console.log('listening on *:9088');
});
// // *****************************加密*******************************
// const cipher = crypto.createCipher('aes192', 'a password');

// let encrypted = cipher.update('some clear text data', 'utf8', 'hex');
//     encrypted += cipher.final('hex');
// console.log(encrypted);
// // 解密
// var decipher = crypto.createDecipher('aes192','a password');
// var dec = decipher.update(encrypted,'hex','utf8');
//     dec += decipher.final('utf8');
// // console.log(dec);
// // ********************生成二维码**********************************
// function create_code(url,callback){
//     var temp_qrcode = qr.image(url,{type:'png',size:6});
//     var imgName = +(new Date())+''+Math.ceil(Math.random()*89+10);
//         imgName = `${imgName}.png`;
//     // 保存二维码图片的路径
//     var catalog = './codeimg';
//     var catalog1 = '/codeimg';
//     fs.exists("./codeimg", function(exists) {  
//         if (exists == false) {
//             fs.mkdir(catalog);
//         }
//         var img_url = catalog+'/'+imgName;
//         var pipe = temp_qrcode.pipe(fs.createWriteStream(img_url));
//         pipe.on('error', function(err){
// 	        callback(-1,'error');
// 	        return;
// 	    })
// 	    pipe.on('finish', function(){
// 	        callback(1,catalog1+'/'+imgName);
// 	    })
//     }); 

// }
// create_code("123",function(ret,info){
// 	if(ret == 1){
//         console.log(info);
//     }
// });
// **********************内存的测试*********************************
// const startUsage = process.cpuUsage();
// // { user: 38579, system: 6986 }

// // spin the CPU for 500 milliseconds
// const now = Date.now();
// // while (Date.now() - now < 500);
// setTimeout(function(){
//    var user = process.cpuUsage(startUsage).user;
//    console.log(user);
//    console.log(user/500000);
// },500);
// console.log(process.cpuUsage(startUsage));

// ************************文件系统****************************
// 文件是否可以被当前进程读取和写入。
// fs.access('/etc/passwd', fs.constants.R_OK | fs.constants.W_OK, (err) => {
//   console.log(err ? 'no access!' : 'can read/write');
// });
// var file = "a.js";  
// var str1 = [{
//         tablename: "chat_message",
//         fields: {
//             id: { des: "序号", type: "INTEGER PRIMARY KEY AUTOINCREMENT" },
//             roomid: { des: "项目id,roomid", type: "TEXT" },
//             sender: { des: "发送者", type: "TEXT" },
//             time: { des: "发送日期", type: "TIMESTAMP NOT NULL DEFAULT (datetime('now','localtime'))" },
//             content: { des: "内容", type: "TEXT" },
//             //系统类型,0 系统类型 >0 普通类型
//             type: { des: "内容类型", type: "INTEGER" },
//             img_url:{des:"图片",type:"TEXT"}
//         },
//         fieldnum:6
//     },
//     {
//          tablename: "draw_message",
//          fields: {
//              id: { des: "序号", type: "INTEGER PRIMARY KEY AUTOINCREMENT" },
//              roomid: { des: "项目id,roomid", type: "TEXT" },
//              imageid:{des: "图纸id", type: "TEXT" },
//              sender: { des: "发送者", type: "TEXT" },
//              time: { des: "发送日期", type: "TIMESTAMP NOT NULL DEFAULT (datetime('now','localtime'))" },
//              content: { des: "内容", type: "TEXT" },
//              //系统类型,0 系统类型 >0 普通类型
//              type: { des: "内容类型", type: "INTEGER" }
//          },
//          fieldnum: 6
//      }]; 
// writeFile(file,JSON.stringify(str1));  
// readFile(file);  
  
// function writeFile(file,str){  
//     // 测试用的中文  
     
//     // // 把中文转换成字节数组  
//     // var arr = iconv.encode(str, 'gbk');  
//     // console.log(arr);  
      
//     // appendFile，如果文件不存在，会自动创建新文件  
//     // 如果用writeFile，那么会删除旧文件，直接写新文件  
//     fs.writeFile(file, str, function(err){  
//         if(err)  
//             console.log("fail " + err);  
//         else  
//             console.log("写入文件ok");  
//     });  
// }  
// // 参数file，必须保存为utf8格式，否则里面的中文会乱码  
// function readFile(file){  
//     // readFile的第2个参数表示读取编码格式，如果未传递这个参数，表示返回Buffer字节数组  
//     fs.readFile(file, "utf8", function(err, data){  
//         if(err)  
//             console.log("读取文件fail " + err);  
//         else{  
//             // 读取成功时  
//             console.log(JSON.parse(data)[0].fields.id.des);// 直接输出中文字符串了  
//         }  
//     });  
// }  
function rename(oldpath){
    fs.rename(oldpath,oldpath+'.pdf',function(err){
        if(err){
           throw err;
         }else{
            console.log('done!'); //重命名成功
         }           
    });
}
// rename('./server_file/uploads/prosystem/5ccd7ae339c1bcea4a52bc6def84c64e');
function substr_filename(str){
    filename = str.substr(str.lastIndexOf("/")+1);
    filename = filename.match(/(\S*)\.pdf/)[1];
    return filename;
}
function substr_pdfurl(str){
    str = str.substr(str.lastIndexOf('/', str.lastIndexOf('/') - 1) + 1);
    str = './server_file/'+str;
    return str;
}
var pdf_url_absolute = 'http://192.168.1.232:9060/pdffile/2.pdf';
var pdf_url = substr_pdfurl(pdf_url_absolute);
var filename = substr_filename(pdf_url_absolute);
var image_url = './server_file/image/' +filename+'%03d.jpg';
// console.log(pdf_url,image_url);
// var image = spawn("gm",
//         ['convert',pdf_url,'-scene','1','+adjoin',image_url]);

// get,post请求
// get 获取指定的视频信息
app.get("/getmp4/:name",function(req,res){
    var name = req.params.name;
      res.writeHead(200, {'Content-Type': 'video/mp4'});  
      var rs = fs.createReadStream('./server_file/minyanan/video/mm.mp4');  
      
      rs.pipe(res);  
      
      rs.on('end',function(){  
        res.end();  
        console.log('end call');  
      });
      rs.on('error',function(err){
        console.log('error error 视频路径出错');
      });
     // res.send({ret:1,info:name});
    
});
http.on('error',function(err){ 
console.log('err'); 
});
// post
app.post("",function(req,res){
        
});
// 对map的数据进行分页
var map = new Map();
var size_data = [];
var pagedata = {};
var obj1 = {name:"ww1",type:"aa",status:"上线"};
var obj2 = {name:"ww2",type:"aa",status:"上线"};
var obj3 = {name:"ww3",type:"aa",status:"上线"};
var obj4 = {name:"ww4",type:"aa",status:"上线"};
var obj5 = {name:"ww5",type:"aa",status:"上线"};
map.set("1",obj1);
map.set("2",obj2);
map.set("3",obj3);
map.set("4",obj4);
map.set("5",obj5);
size_data.push("1");
size_data.push("2");
size_data.push("3");
size_data.push("4");
size_data.push("5");
function map_page(map,size_data,pagedata){
   // console.log(map);
   var result = {};
   var pagesize = pagedata.rows;//每页显示行数
   var pagenumber = pagedata.page;
   var size = map.size;
   if (pagenumber == null)
        pagenumber = 1;
   if (pagesize == null)
        pagesize = 10;
   var pagecount = (size - 1) / pagesize + 1;
   var offset = pagesize * (pagenumber - 1);
   var rows_data = [];
   console.log(pagenumber);
   if (size > 0){     
     for (var i = offset,count=0; i < size_data.length; i++){
      if (++count <= pagesize) {
        var key = size_data[i];
        var obj = map.get(key);
        obj.deviceid = key;
        rows_data.push(obj);
      }else{
        break;
      }       
     }  
   }
    result.page = pagenumber;//当前页码
    result.total = parseInt(pagecount);//计算页数
    result.records = size;//总共长度
    result.rows = rows_data;//当前页码的数据
    console.log(result);
}
// map_page(map,size_data,pagedata);


   // var files = fs.readdirSync(path);
   // files.forEach((val,index) => {
   //      let fPath = join(path,val);
   //      let stats = fs.statSync(fPath);
   //      // if(stats.isDirectory())
   //      var substr_name = substr_url2(fPath);
   //      if(stats.isFile() && substr_name == filename){
   //         count++;
   //      }
   //  })

   // 判断文件是否存在
function path_isFile(path,cb){  
    fs.access(path,fs.constants.R_OK | fs.constants.W_OK,function(err){
      if (err) {
        if (err.code === 'ENOENT') {
            // console.log("no file error error please see me");
          // return;
        }
        if(cb!=null)
            cb(-1,"myfile does not exist");
      }
      else{
        if(cb!=null)
            cb(1,"exist");
     }
  });
} 
function substr_url2(str){
    str = str.match(/(\S*)-/)[1];
    return str;
}
// var path = './server_file/pdffile/1.pdf';
// var image_url = './server_file/image/1-%03d.jpg';
function pdf_pagecount(path,cb){
   var count = 0;
   var path1 = path + '000' +'.jpg';
   file_count(path1);
   function file_count(path1){
      path_isFile(path1,function(ret,info){
        console.log(ret,info);
        if (ret == 1) {
            count++;
            if (count < 10) {
               file_count(path + '00' + count +'.jpg')
            }else if( 10 <= count < 100){
               file_count(path + '0' + count +'.jpg')
            }else{
               file_count(path + count +'.jpg')
            }
        }else{
          if (cb != null) {
            cb(count);
          }
        }       
      })
   }
}
// pdf_pagecount('./server_file/image/2-',function(count){
//    console.log(count)
// });
var str = "http://192.168.1.232:9060/uploads/prosystem/bf5.pdf";
// console.log(str.indexOf('/'));
// console.log(str.indexOf('/',str.indexOf('/')+1));
str = str.substr(str.indexOf('/', str.indexOf('/') + 2) + 1);
// console.log(str);
str = './server_file/'+str;
// console.log(str);
// let str11 = 'a=123';
// let public_key = fs.readFileSync(__dirname+'/ali_key/rsa_private_key.pem', 'utf-8');
// console.log(public_key);
// let signer = crypto.createSign('RSA-SHA256');
// signer.update(str11);
// let sign = signer.sign(public_key, 'base64');
// console.log(sign);


var uuid = require('node-uuid');  
// console.log(uuid.v1());
var r = Math.random() * 0x10000 | 0;
// console.log(r+"-"+Date.now());
// 读取二进制文件
var file_url = './0816.dwg';
function readfile(file_url,cb){
  fs.readFile(file_url, function(err, data){  
        if(err)  
            console.log("读取文件fail " + err);  
        else{  
            // 读取成功时  
            if (cb!=null) {
              cb(data);
            }
        }  
  });  
}
var PosSentinel; //文件描述块的位置 int
var TypePreview; //缩略图格式 int
var PosBMP;       //缩略图位置 int
var LenBMP;       //缩略图大小 int
var biBitCount; //缩略图比特深度 short
var TypePreview;//第31字节为缩略图格式信息，2 为BMP格式，3为WMF格式
var biH = {};

// const buf = Buffer.from([0X03, 0XC0, 0X01, 0X00]);

// Prints: 5
// console.log(buf.readInt32LE());
// readfile(file_url,function(buf){
//    // var version = buf.slice(0,12).toString();   
//    // 32位有符号整型，4个字节，从13到17字节
//    PosSentinel = buf.readInt32LE(12);//文件描述块的位置
//    console.log(PosSentinel);
//    // 1个字节，第31字节 
//    TypePreview = buf.readUInt8(PosSentinel+30);//第31字节为缩略图格式信息
//    console.log(TypePreview);
//    // 1个字节，第32字节
//    PosBMP = buf.readInt32LE(PosSentinel+30+1); //DWG文件保存的位图所在位置
//    // 1个字节，第33字节
//    LenBMP = buf.readInt32LE(PosSentinel+30+5);//位图的大小
//    //移动指针到位图块
//    biBitCount = buf.readInt16BE(PosBMP+14); //读取比特深度
//    console.log(PosBMP,LenBMP,biBitCount);
//    //从位图块开始处读取全部位图内容备用
//    // BMPInfo = buf.readIntBE(PosSentinel, LenBMP); //不包含文件头的位图信息
//    // console.log(BMPInfo);
//     biH.bfType = 19778; //建立位图文件头
//     if (biBitCount < 9)
//     {
//       biH.bfSize = 254 + 4 * (parseInt(Math.pow(2, biBitCount))) + LenBMP;
//     }
//     else
//     {
//       biH.bfSize = 254 + LenBMP;
//     }
//       biH.bfReserved1 = 0; //保留字节
//       biH.bfReserved2 = 0; //保留字节
//       biH.bfOffBits = 14 + 40 + 1024; //图像数据偏移
//       //以下开始写入位图文件头
//       // bmpr.Write(biH.bfType); //文件类型
//       // bmpr.Write(biH.bfSize); //文件大小
//       // bmpr.Write(biH.bfReserved1); //0
//       // bmpr.Write(biH.bfReserved2); //0
//       // bmpr.Write(biH.bfOffBits); //图像数据偏移
//       // bmpr.Write(BMPInfo); //写入位图
// });

// 大图分割:
// 分割图片
function create_division_image(floors,key,floorinfo,cb){
       // console.log(floors,key);
       var row = floorinfo.row;
       var col = floorinfo.col;
       var width = floorinfo.width;
       var height = floorinfo.height;
       var or_url = floorinfo.thum_url;
       var count = floorinfo.count;
       var url2 = '../minyanan/m/'+'-f'+key+'_';
       var obj = {};
       obj.width = parseFloat(width/col);
       obj.height = parseFloat(height/row);
       if (count > 1) {
          for (var i = 0; i < row; i++) {
            for (var j = 0; j < col; j++) {
              var i_ = i;
              var j_ = j;
              var re_url = url2+i+'_'+j+'.jpg';
              obj.x = obj.width*j;
              obj.y = obj.height*i;
              server_image.crop2(or_url,re_url, obj,function(ret,info){
                 if (ret == 1) {
                   // console.log(ret,info);
                 }
              });
            }
          }
       }
       if (floors == key) {
        cb(1,'ok');
       }

 }
class split{//默认1280*960是4层，则第1层缩略图大小为320*240
    constructor(width,height,url){       
        this.url = url; 
        this.width = width;//图片宽度
        this.height = height;//高度
        this.compare_width = 1280;// 默认参照图片的宽度 
        this.compare_height = parseInt((height*this.compare_width)/width);// 默认参照图片的高度
        this.compare_floors = 4;// 默认参照物层级
        this.f1_width = parseFloat(this.compare_width/this.compare_floors);
        this.f1_height = parseFloat(this.compare_height/this.compare_floors);
        // 根据参照物计算层数，和每层信息
        this.floors = this.create_floor_count();//计算层数
        // console.log(this.floors);
        this.info = this.create_allfloor_info();
    }
    // 
    // 设置：指定图片大小的层数(参照物)
    set_image_floors(width,height,floors){
        this.compare_width = width;
        this.compare_height = height;
        this.compare_floors = floors;
        this.f1_width = parseFloat(compare_width/compare_floors);
        this.f1_height = parseFloat(compare_height/compare_floors);
        // 重新计算层数，和每层信息
        this.floors = this.create_floor_count();//计算层数
        this.info = create_allfloor_info();
    }
    // 设置：输入层级，行列信息：个数=行*列
    //       输出该层信息:个数，每个大小，
    create_floor_info(floor,row,col){
        var one_info = this.info[floor];
        if (one_info == null) {
          return '请设置'+this.floors+'层及以内';
        }
        one_info.count = row*col;
        one_info.row = row;
        one_info.col = col;
        return 'ok';
    }
    // 计算层数的方法
    create_floor_count(){
      var floors = 0;     
      var count_width = Math.floor(this.width/this.f1_width);
      var count_height = Math.floor(this.height/this.f1_height);
      if (count_width >= count_height ) {
        floors = count_width;
      }else{
        floors = count_height;
      }
      return floors;
    }
    // 计算所有层的信息,默认每层个数为n*n
    create_allfloor_info(){
      var obj = {};
      if (this.floors <= 0) {
        return obj;
      }
      var floors = this.floors;
      // console.log(this.f1_width,this.f1_height);
      for (var i = 1; i <= floors; i++) {    
         var num = i;  
         obj[num] = {};
         var row = num;
         var col = num;
         var width,one_width;
         var height,one_height;        
         obj[num]['count'] = row * col;
         width = this.f1_width*num;
         height = parseInt((width*this.height)/(this.width));
         obj[num]['row'] = row;
         obj[num]['col'] = col;
         obj[num]['width'] = width;
         obj[num]['height'] = height;          
      }
      return obj;
    }
    // 生成每层缩略图
    create_floor_image(cb){       
       // 生成缩略图,并将信息存在this.info中
       var allinfo = this.info;
       var url1 = this.url;
       var url2 = '../minyanan/m';
       var floors = this.floors;
       for (var key in allinfo) {
          var value = allinfo[key];          
          var width = value.width;
          var height = value.height;
          var url3 = url2 +'-' + key+'.jpg';
          // console.log(key,url3);
          this.create_thum_image(key,url1,url3,width,height,function(ret,info,floor){
            // console.log(floor,info);
            if (ret == 1) {
              allinfo[floor].thum_url = info.thum_url;
              allinfo[floor].width = info.width;
              allinfo[floor].height = info.height;
              if(floors == floor){
                // 缩略图全部生成ok
                cb(1,allinfo);
              }
            }
            
          })
       }   
    }
    // 调用server_image里面的方法
    create_thum_image(floor,url1,url2,width,height,cb){
      server_image.create_thumimage(url1,url2,width,height,function(ret,info){
           // console.log(ret,info);
           if (cb!=null) {
            cb(ret,info,floor);
           }
       });
    }
    // 得出所有的信息
    get_all_info(cb){
        var floors = this.floors;
        this.create_floor_image(function(ret,allinfo){
            // console.log(ret,allinfo);
            // 分割图片
            if (ret == 1) {
               for (var key in allinfo) {
                 create_division_image(floors,key,allinfo[key],function(ret,floor,info){
                    if (ret == 1){
                      // 分割成功
                       cb(1,allinfo);
                    }
                 })
               }

            }
        });   
    }
}
// server_image.get_size('../minyanan/minyanan.jpg',function(ret,value){
//       var info = new split(value.width,value.height,'../minyanan/minyanan.jpg');//1920*1200
//       var bb = info.create_floor_info(5,3,4);
//       var cc = info.create_floor_info(6,3,5);
//       info.get_all_info(function(ret,info){
//          console.log(ret,info); 
//       });
// });

// var info = server_image.get_size('../minyanan/minyanan.jpg');
// var url1 = '../minyanan/minyanan.jpg';
// var url2 = '../minyanan/m2.jpg';
// server_image.create_thumimage(url1,url2,500,500,function(ret,info){
//    console.log(ret,info);
// });
// module.exports = split;
var url1 = 'c:/minyanan/1.pdf';
// fs.readFile(url1, function(err, data){  
//     if(err)  
//         console.log("读取文件fail " + err);  
//     else{  
//         // 读取成功时  
//         var buf = data;
//         var flag = 0;
//         var start = 0;
//         var end = 0;
//         while(end < buf.length && flag == 0){
//           end = start + 50;
//           var info = buf.slice(start,end).toString();
//           start = end;
//           var reg = new RegExp("/Count [0-9]+","");
//           if (reg.test(info)) {
//             flag = 1;
//             var page = info.match(/\/Count (\S*)\/Kids/)[1];
//             console.log(page); 
//           }
//         }                  
//     }  
// });
// fs.open(url1, 'r', function(err, fd) {
//      if(err) {
//         console.error(err);
//         return;
//       } else {
//         var buffer = Buffer.alloc(255);
//         //每一个汉字utf8编码是3个字节，英文是1个字节
//         fs.read(fd, buffer, 0, 255, 0, function (err, bytesRead, buffer) {
          
//           if(err) {
//             throw err;
//           } else {
//             var info = buffer.slice(0, bytesRead).toString();
//             var page = info.match(/\/Count (\S*)\/Kids/)[1];
//             console.log(page);
//           }
//         });
        
//       }
//       fs.close(fd,function(res){
//             // console.log(res);
//           });
// });
